import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import XEUtils from 'xe-utils'
// 错误码 errorCode 多语言以en为标准
import errorCode from '@/i18n/en/errorCode';
// 语言包
import i18n from '@/i18n'

/** 
 * 提示函数 
 * 禁止点击蒙层、显示一秒后关闭
 */
 const tip = msg => {    


  Message({
    message: msg || 'Error',
    type: 'error',
    duration: 1 * 1000
  })

}

/** 
* 跳转登录页
* 携带当前页面路由，以期在登录页面完成登录后返回当前页面
*/
// const toLogin = () => {
//   router.replace({
//       path: '/login',        
//       query: {
//           redirect: router.currentRoute.fullPath
//       }
//   });
// }

/** 
* 请求失败后的错误统一处理 
* @param {Number} status 请求失败的状态码
*/
const errorHandle = (status, other) => {
  // 状态码判断
  switch (status) {
      // 401: 未登录状态，跳转登录页
      case 401:
          toLogin();
          break;
      // 403 token过期
      // 清除token并跳转登录页
      case 403:
          tip('登录过期，请重新登录');
          // localStorage清除token
          localStorage.removeItem('token');
          // 状态管理初始化token
          store.dispatch('user/resetToken', false)
          setTimeout(() => {
              toLogin();
          }, 1000);
          break;
      // 404请求不存在
      case 404:
          tip('请求的资源不存在'); 
          break;
      default:
          console.log(other);   
  }
}

// create an axios instance
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5*1000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      // config.headers['X-Token'] = getToken()
      /* 请求header携带token */
      let token = store.getters.token || getToken();
      // console.log('token:',token);
      token && (config.headers.Authorization = token);

    }
    return config
  },
  error => {
    // do something with request error
    // console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    // http状态码为200
    if (response.status === 200) {
      const res = response.data

        const errorMsg = XEUtils.clone(errorCode, true)
        // 获取成功错误代码的key值（20000，20001...）
        const errorMsgSucceedKeys = []
        XEUtils.objectEach(errorMsg.succeed, (item, key) => {
          errorMsgSucceedKeys.push(key)
        })
        
        let emsg,etype;
 
        // 如果error_code 不是 20000  20001 20002 20004 ...，  it is judged as an error.
        if (XEUtils.arrayIndexOf(errorMsgSucceedKeys, res.err_code) === -1) {
          // 获取错误代码对象
          let errorMsgSucceedObj = errorMsg.failed[`${res.err_code}`]

          if (!XEUtils.isEmpty(errorMsgSucceedObj)) {
            // 获取错误代码对应报错信息
            emsg = i18n.t(`errorCode.failed.${res.err_code}.msg`) 
            etype = i18n.t(`errorCode.failed.${res.err_code}.type`)
          }else{
            emsg = 'Error'
            etype = 'error'
          }
          
          Message({
            message: emsg,
            type: etype,
            duration: 1 * 1000
          })
          return Promise.reject({
            emsg,
            etype,
            err_code:res.err_code
          })
        }else{
          // 获取错误代码对象
          let errorMsgSucceedObj = errorMsg.succeed[`${res.err_code}`]
          // console.log('errorMsgSucceedObj',errorMsgSucceedObj);
          // 如果不是空对象和null 提示错误代码信息
          if (!XEUtils.isEmpty(errorMsgSucceedObj)) {
            // 获取错误代码对应报错信息
            emsg = i18n.t(`errorCode.succeed.${res.err_code}.msg`)  || ''
            etype = i18n.t(`errorCode.succeed.${res.err_code}.type`) || ''
            if (emsg !== '' && etype !== '') {
              Message({
                message: emsg,
                type: etype,
                duration: 1 * 1000
              })
            }
          }

          return res
        }
         


        
        
        // console.log('errorMsg:::',errorMsg);
        // console.log('errorMsgKey:::',errorMsgSucceedKeys);

        
        // // if the custom code is not 20000, it is judged as an error.
        // if (res.err_code !== '20000') {

        //   // 集中对错误码处理
        //   Message({
        //     message: res.msg || 'Error',
        //     type: 'error',
        //     duration: 5 * 1000
        //   })

  
        //   // 50008: 非法的 Illegal token; 50012: 其他客户端登录 Other clients logged in; 50014: 令牌过期 Token expired;
        //   // 如果以上状态码，询问是否刷新token
        //   // if (res.err_code === 50008 || res.err_code === 50012 || res.err_code === 50014) {
        //   //   // to re-login
        //   //   MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
        //   //     confirmButtonText: 'Re-Login',
        //   //     cancelButtonText: 'Cancel',
        //   //     type: 'warning'
        //   //   }).then(() => {
        //   //     store.dispatch('user/resetToken').then(() => {
        //   //       location.reload()
        //   //     })
        //   //   })
        //   // }
        //   // return false;
        //   return Promise.reject(new Error(res.msg || 'Error'))
        //   // Promise.reject(response)
        // } else {
        //   return res
        // }
    }else{
      // 不是正常状态码200
      Promise.reject(response)
    }
    
  },
  error => {

      const { response } = error;
      // 对非200的状态码处理
        if (response) {
            // 请求已发出，但是不在2xx的范围  暂时不考虑 200 以外状态码处理
            errorHandle(response.status, response.data.msg);
            return Promise.reject(new Error(response.data.msg || 'Error'))  //现在配合elementadmin返回的代码
            // return Promise.reject(response); //以前返回代码
        } else {
            // 处理断网的情况
            // eg:请求超时或断网时，更新state的network状态
            // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
            // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
            Message({
              message: '网络中断',
              type: 'error',
              duration: 5 * 1000
            })
            store.dispatch('app/setNetwork', false)
        }
  }
)

export default service
